﻿using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioSistema : IRepositorioSistema
    {
        public Sistema Inserir(Sistema sistema)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(sistema);
            return sistema;
        }

        public Sistema Atualizar(Sistema sistema)
        {
            Sistema tmpSistema = ObterPorId(sistema.SistemaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpSistema.Descricao = sistema.Descricao;
            tmpSistema.Codigo = sistema.Codigo;
            tmpSistema.Email = sistema.Email;
            tmpSistema.Senha = sistema.Senha;
            tmpSistema.Porta = sistema.Porta;
            tmpSistema.ProtocoloEnvio = sistema.ProtocoloEnvio;
            tmpSistema.ProtocoloRecebimento = sistema.ProtocoloRecebimento;

            tmpSistema.ListaSistemaPerfil.Clear();
            foreach (SistemaPerfil sistemaPerfil in sistema.ListaSistemaPerfil)
            {
                tmpSistema.AdicionarSistemaPerfil(sistemaPerfil);
            }

            tmpSistema.ListaTela.Clear();
            foreach (Tela tela in sistema.ListaTela)
            {
                tmpSistema.AdicionarTela(tela);
            }
            
            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpSistema);
            return tmpSistema;
        }

        public void Excluir(Sistema sistema)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(sistema);
        }

        public IList<Sistema> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Sistema));
            return criteria.List<Sistema>() as List<Sistema>;
        }

        public IList<Sistema> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Sistema))
                .SetFirstResult(inicio)
                .SetMaxResults(quantidade);

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            return criteria.List<Sistema>() as List<Sistema>;
        }

        public Sistema ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Sistema>(id);
        }

        public Sistema ObterPorCodigo(string codigo)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Sistema))
                .Add(Restrictions.Eq("Codigo", codigo))
                .UniqueResult<Sistema>();
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Sistema)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("SistemaId"));


            Sistema sistema = criteria.UniqueResult<Sistema>();
            int ultimoCodigo = sistema != null ? sistema.SistemaId : 0;

            return ultimoCodigo;
        }
    }
}